package com.vcg.community.common.base;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.vcg.community.common.utils.JsonUtil;

public abstract class BaseServiceImpl<T> implements BaseService<T> {

	/**
	 * 处理持久化操作的基类
	 */
	protected BaseDao<T> baseDao;

	public abstract void setDao();
	
	private Logger log=Logger.getLogger(this.getClass());

	/*
	 * public void setBsBasicMapper(BasicMapper<T,PK> bsBasicMapper) {
	 * this.bsBasicMapper = bsBasicMapper; }
	 */

	// 用于json转对象
	private Class<?> type = null;

	// 用于获取插入数据表中返回的主键方法
	private Method getPk = null;

	public BaseServiceImpl() {
		// 获取泛型参数,防止CGLIB两次加载
		if (type == null&&!this.getClass().getName().contains("EnhancerBySpringCGLIB")) {
			ParameterizedType superGclass = (ParameterizedType) this.getClass().getGenericSuperclass();
			Type[] arguments = superGclass.getActualTypeArguments();
			if (arguments.length > 0) {
				type = (Class<?>) arguments[0];
			}

			// 获取BaseModel中getPk方法
			try {
				Class<?> superclazz = type.getSuperclass();
				getPk = superclazz.getMethod("getPk");
			} catch (NoSuchMethodException e) {
				log.error("未找到getPk方法,请检测 是否继承 BaseModel");
			}
		}
	}

	/**
	 * Json 新增业务
	 */
	public Integer insertByJson(String json) {
		T obj = getObj(json);
		return insert(obj);
	}

	/**
	 * 获取所有对象,转换成json
	 * 
	 * @return
	 */
	public String getAllToJson() {
		return toJSONString(getAll());
	}

	/**
	 * 根据id获取对象,转换成json
	 * 
	 * @param id
	 * @return
	 */
	public String getByIdToJson(Integer id) {
		return toJSONString(getById(id));
	}

	/**
	 * 根据条件获取对象,转换Json字符串
	 * 
	 * @param map
	 * @return
	 */
//	public String getByJsonCondition(String json) {
//		Map<String, Object> map = JsonUtil.parseObject(json, HashMap.class);
//		return toJSONString(getByMapCondition(map));
//	}


	/**
	 * 根据json条件统计总条数
	 */
	public String countByConditionToJson(String json) {
		Map<String, Object> map = JsonUtil.parseObject(json, HashMap.class);
		return toJSONString(map);
	}

	/**
	 * 根据条件分页,转换成json
	 */
//	public String getResultWithPageToJson(String json) {
//		Map<String, Object> map = JsonUtil.parseObject(json, HashMap.class);
//		return toJSONString(getResultWithPage(map));
//	}

	/**
	 * 统计总条数,转换json
	 * 
	 * @return
	 */
//	public String countToJson() {
//		return toJSONString(count());
//	}

	/**
	 * 执行sql 转换json
	 * 
	 */
//	public String executeSqlToJson(String sql) {
//		setDao();
//		return toJSONString(baseDao.executeSql(sql));
//	}

	/**
	 * 新增业务
	 */
	public Integer insert(T t) {
		setDao();
		baseDao.insert(t);
		try {
			return (Integer) getPk.invoke(t);
		} catch (Exception e) {
			log.error("插入失败!:"+this.getClass().getName()+".insert");
		} 
		return null;
	}

	/**
	 * 获取所有对象
	 * 
	 * @return
	 */
	public List<T> getAll() {
		setDao();
		return baseDao.getAll();
	}

	/**
	 * 根据id获取对象
	 * 
	 * @param id
	 * @return
	 */
	public T getById(Integer id) {
		setDao();
		return baseDao.selectByPrimaryKey(id);
	}

	/**
	 * 根据条件获取对象
	 * 
	 * @param map
	 * @return
	 */
//	@SuppressWarnings("rawtypes")
//	public List<T> getByMapCondition(Map map) {
//		setDao();
//		return baseDao.getByMapCondition(map);
//	}

	/**
	 * 根据条件分页
	 */
//	@SuppressWarnings("rawtypes")
//	public List<T> getResultWithPage(Map map) {
//		setDao();
//		return baseDao.getResultWithPage(map);
//	}

	/**
	 * 统计总条数
	 * 
	 * @return
	 */
//	public Long count() {
//		setDao();
//		return baseDao.count();
//	}

	/**
	 * 根据条件 统计总条数
	 * 
	 * @return
	 */
//	@SuppressWarnings("rawtypes")
//	public Long countByCondition(Map map) {
//		setDao();
//		return baseDao.countByCondition(map);
//	}

	/**
	 * 执行sql
	 * 
	 */
//	public List<Map<String, Object>> executeSql(String sql) {
//		setDao();
//		return baseDao.executeSql(sql);
//	}

	/**
	 * 更新
	 */
	public Integer update(T t) {
		setDao();
		return baseDao.updateByPrimaryKey(t);
	}


	/**
	 * json转对象
	 */
	public T getObj(String json) {
		return JsonUtil.parseObject(json, type);
	}

	/**
	 * 对象转换为json字符串
	 */
	public String toJSONString(Object obj) {
		return JsonUtil.toJSONString(obj);
	}

}
